package com.xb.loan.cashier.biz.job;

import com.xb.loan.cashier.biz.dao.bean.CashierEncashBatch;
import com.xb.loan.cashier.biz.service.CashierEncashBatchService;
import com.xb.loan.cashier.biz.task.TaskManagerFactory;
import com.xb.loan.cashier.biz.task.ThirdEncashTask;
import com.xb.loan.cashier.service.constant.ICashierEnumConst;
import com.xb.loan.util.qrtz.task.AbstractCronTask;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;

import java.util.List;

/**
 * 从数据库或队列中取出一批提现订单，加入TaskManager
 * 5分钟执行一次，不支持并发，如果部署多套收银台该类只能在一套上面运行
 */
public class EncashJob extends AbstractCronTask {

    private static Logger logger = LoggerFactory.getLogger(EncashJob.class);
    
    public static final int PAGE_SIZE = 100;
    
    private CashierEncashBatchService cashierEncashBatchService;
    @Override
    public void run() {
        execute();
    }

    public void execute() {
    	logger.info("提现JOB开始执行：EncashJob");
        if(cashierEncashBatchService==null){
            cashierEncashBatchService = getSpringBean("cashierEncashBatchService");
        }
        
        int pageNo = 1;
        while(true){
            List<CashierEncashBatch> batchs = cashierEncashBatchService.selectWaitingBatchs(pageNo++, PAGE_SIZE);
            if(CollectionUtils.isEmpty(batchs)){
            	logger.warn("没有需要提现的批次信息：EncashJob");
                return;
            }
            for(CashierEncashBatch batch : batchs){
                ThirdEncashTask task = null;
                if(batch.getPaychannelType()== ICashierEnumConst.CashierPayChannelType.ALIPAY.getType()){
                	task = getSpringBean("alipayWapEncashTask");
                	task.setCashierEncashBatch(batch);
                }
                if(task==null){
                    logger.warn("Model={0} batchId={1} payChannelId={2} paychannelType={3} bankCodePlat={4} msg={5}", new Object[]{"cashier", batch.getBatchId(), batch.getPayChannelId(), batch.getPaychannelType(), batch.getBankCodePlat(), "任务类型不存在！"});
                    continue;
                }
                
                TaskManagerFactory.getTaskManager(ICashierEnumConst.TaskManagerCode.ENCASH_QUERY).addTask(task);
            }
        }
    }

    public void setCashierEncashBatchService(CashierEncashBatchService cashierEncashBatchService) {
        this.cashierEncashBatchService = cashierEncashBatchService;
    }
    
}
